package com.itheima.security.springboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @author xiaoxiaokui
 * @description: WebSecurityConfig
 * @date 2019/11/18
 **/
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)  // 基于方法的授权
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * @description 密码编码器
     * @author xiaoxiaokui
     * @date 2019/11/18
     * @param
     * @return org.springframework.security.crypto.password.PasswordEncoder
     * @modifier
     * @note
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * @description 安全拦截机制（最重要）
     * @author xiaoxiaokui
     * @date 2019/11/18
     * @param http
     * @return void
     * @modifier
     * @note
     **/
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf()
                // 屏蔽CSRF控制，即spring security不再限制CSRF
                .disable()
                .authorizeRequests()
//                .antMatchers("/r/r1").hasAnyAuthority("p1")
//                .antMatchers("/r/r2").hasAnyAuthority("p2")
                // 所有/r/**的请求必须认证通过
                .antMatchers("/r/**").authenticated()
                // 除了/r/**，其它的请求可以访问
                .anyRequest().permitAll()
                .and()
                // 允许表单登录
                .formLogin()
                // 指定我们自己的登录页，spring security以重定向方式跳转到/login-view
                .loginPage("/login-view")
                // 指定登录处理的URL，也就是用户名、密码表单提交的目的路径
                .loginProcessingUrl("/login")
                // 自定义登录成功的页面地址
                .successForwardUrl("/login-success")

                // 如果需要就创建一个（session）登录时
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)

                // 自定义登出页面
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login-view?logout");
    }

}
